#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<cstdlib>
using namespace std;


//信号产生
//./mykill 2 1234    系统调用
// int main(int argc,char*argv[])
// {
//     if(argc!=3)
//     {
//         cerr<<"Usage:"<<argv[0]<<"signum pid"<<endl;
//         return 1;
//     }
//     pid_t pid = stoi(argv[2]);
//     int signum = stoi(argv[1]);
//     kill(pid,signum);
// }
//raise系统调用
// int main()
// {
//     while(true)
//     {
//         sleep(2);
//         raise(3);//调用3号信号
//     }
// }
//abort系统调用
// int main()
// {
//     while(true)
//     {
//         sleep(2);
//         abort();
//     }
// }
//软件条件
// int main()
// {
//     int cnt = 1;
//     alarm(1);//设定1秒后的闹钟-》1秒之后发出SIGALRM的信号
//     while(true)
//     {
//         cout<<"cnt:"<<cnt<<endl;
//         cnt++;
//     }
// }
//异常
void Handler(int signo) 
{
    //当对应的信号被触发，内核会将对应的信号编号传递给自定义的方法
    cout<<"Get a signal,signal number is "<<signo<<endl;
}
int main()
{
    //程序为什么会崩溃：非法访问，导致os给进程发送信号了（8号信号）
    //崩溃为什么会退出：默认是终止进程
    //可以不退出吗：可以，捕捉异常，推荐终止进程（本质是释放进程的上下文数据）
    signal(SIGFPE,Handler);//浮点数错误

    signal(SIGSEGV,Handler);//野指针
    while(true)
    {
        cout<<"hello bit pid"<<getpid()<<endl;
        int a=10;
        a=a/0;

        // int *p = nullptr;
        // *p = 10;
    }
}
// void Handler(int signo) 
// {
//     //当对应的信号被触发，内核会将对应的信号编号传递给自定义的方法
//     cout<<"Get a signal,signal number is "<<signo<<endl;
// }
// int main()
// {
//     //signal不放在循环里因为信号产生一次进程就记住了。只要捕捉一次后续一直有效。
//     //signal没有产生信号时，Handler不会被调用。
//     //对更多信号进行捕捉
//     signal(SIGINT,Handler);//默认的终止->自定义的执行方法：Handler；
//     //  
//     while(true)
//     {
//         cout<<"hello world"<<endl;
//         sleep(1);
//     }
//     return 0;
// }